home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Turnbull China Bikeride
/
Turnbull China Bikeride - Disc 1.iso
/
ARGONET
/
PD
/
DESKTOP
/
MYMENU.ZIP
/
Sources
/
SourceRM
(
.txt
)
next >
Wrap
RISC OS BBC BASIC V Source
|
1997-01-29
|
24KB
|
869 lines
Richard Atterer 1996
=0:sp=13:lr=14:
$" at line ";
0save$=":4.$.Coding.MyMenu.!MyMenu.!RunImage"
type$="Module"
,size%=5<<10:
code% size%:L%=code%+size%
debugging%=0
debugging%
"Lib:Debug2"
washerefile$="RAM:IWasHere"
*washerefile$="<MyMenu$Dir>.^.IWasHere"
Message_SaveDesktop=10
Message_MenusDeleted=&400C9
Message_HelpRequest=&502
Message_HelpReply=&503
!code%=3:
"OS_Word",14,code%:
"Territory_ConvertDateAndTime",1,code%,code%+8,256,"%DY %M3 %CE%YR"
,A%:d$="":
B%=code%+8
A%-1:d$=d$+
"Territory_ConvertDateAndTime",1,code%,code%+8,256,"%ZDY
%CE%YR"
,A%:date$="":
B%=code%+8
A%-1:date$=date$+
p%=12
2:O%=code%:P%=0
:p=p%:
B%,B%,C%:
p%=14
C%>0 p=p%
[optp
-;______...____________________;__________
.module
dcd start
dcd initialisation
dcd finalisation
dcd servicecall
dcd titlestring
dcd helpstring
dcd commandtable
#-;________________________________________
.postfilter
&/teq r0,#6 ;mouse clicks
'.teqne r0,#8 ;key presses
movnes pc,lr
stmfd sp !,{lr}
*#ldrb r14,[r12,#interceptwimp]
+4teq r14,#0 ;is flag byte =0 ?
mvnne r0,#0
-7ldmfd sp !,{pc}^ ;y > don't intercept!
/,.postfiltermask dcd%11100011100000110011
0-;________________________________________
.initialisation
stmfd sp !,{r7,r11,lr}
debugging%
[optp
bl IWasHere_NewFile
adr r0,module
d("module start=^0^"):]
:[optp
ldr r11,[r12]
teq r11,#0
mov r4,#0
strne r4,[r11,#lastopened]
bne init2
mov r0,#6
mov r3,#rmablocksize%
swi "XOS_Module"
ldmvsfdsp !,{r7,r11,lr}
orrvss pc,lr,#1<<28
mov r11,r2
mov r4,#0
str r4,[r11,#taskhandle]
str r4,[r11,#lastopened]
str r4,[r11,#relocadr]
K str r4,[r11,#keyspressed]
str r4,[r11,#keys]
mov r0,#17
adr r1,menufile
swi "XOS_File"
teq r0,#1
bne init_stop3
mov r6,r2,lsl#24
mov r7,r3
mov r0,#17
debugging%
[optp
adr r1,menuscan-1024
add r1,r1,#1024:]
[optp
adr r1,menuscan:]
:[optp
swi "XOS_File"
teq r0,#0
`9beq scanfile ;MenuScan doesn't exist
teq r0,#1
bne init_stop3
teq r2,r6,lsl#24
teqne r3,r7
beq init3
.scanfile
d("scanning menu")
adr r0,scanutil
swi "XOS_CLI"
bvs init_stop2
d("menu scanned")
.init3
mov r0,#&4f
debugging%
[optp
adr r1,menuscan-1024
add r1,r1,#1024:]
[optp
adr r1,menuscan:]
:[optp
x,swi "XOS_Find" ;open file
bvs init_stop2
mov r1,r0
mov r0,#4
add r2,r11,#totalsize
mov r3,#6<<2
~5swi "XOS_GBPB" ;read 6 word header
bvs init_stop
ldrb r3,[r11,#ondemand]
<teq r3,#0 ;load all or just hotkeys?
ldr r4,[r11,#hotkeysize]
/movne r3,r4 ;just hotkeys
&ldreq r3,[r11,#totalsize] ;all
movne r0,#&8000
strne r0,[r11,#menublock]
mov r0,#13
mov r2,r11
swi "XOS_Module"
bvs init_stop
mov r11,r2
str r11,[r12]
mov r0,#4
add r2,r11,#hotkeys
swi "XOS_GBPB"
bvs init_stop
mov r0,#0
(swi "XOS_Find" ;close
bvs init_stop2
.init2
ldr r0,[r11,#menublock]
teq r0,#&8000
ldrne r0,[r11,#hotkeysize]
addne r0,r0,r11
addne r0,r0,#hotkeys
strne r0,[r11,#menublock]
!mov r0,#&10 ;=event vector
adr r1,event
mov r2,r11
swi "OS_Claim"
d("EventV claimed")
mov r0,#14
"mov r1,#11 ;=keypress event
swi "OS_Byte"
ldr r1,[r11,#mouse]
teq r1,#0
&movne r1,#10 ;=mouse button event
swine "OS_Byte"
adr r0,titlestring
adr r1,postfilter
mov r2,r11
,mov r3,#0 ;all tasks
ldr r4,postfiltermask
&swi "Filter_RegisterPostFilter"
d("init finished")
ldmfd sp !,{r7,r11,pc}^
;____________
.init_stop3
mov r2,r0
mov r0,#19
swi "XOS_File"
b init_stop2
.init_stop
mov r7,r0
mov r0,#0
swi "XOS_Find"
.init_stop2
movvs r7,r0
.init_stop1
mov r0,#7
mov r2,r11
swi "XOS_Module"
movvc r0,r7
ldmfd sp !,{r7,r11,lr}
orrs pc,lr,#1<<28
-;________________________________________
.finalisation
stmfd sp !,{r14}
ldr r12,[r12]
d("final1")
ldr r0,[r12,#taskhandle]
cmp r0,#0
ldrgt r1,task
swigt "XWimp_CloseDown"
mov r1,#0
str r1,[r12,#taskhandle]
d("final2")
adr r0,titlestring
adr r1,postfilter
mov r2,r12
mov r3,#0
ldr r4,postfiltermask
(swi "Filter_DeRegisterPostFilter"
d("final3")
mov r0,#13
"mov r1,#11 ;=keypress event
swi "OS_Byte"
d("final4")
ldr r1,[r12,#mouse]
teq r1,#0
&movne r1,#10 ;=mouse button event
swine "OS_Byte"
d("final5")
!mov r0,#&10 ;=event vector
adr r1,event
mov r2,r12
swi "XOS_Release"
d("EventV released")
ldmfd sp !,{pc}
-;________________________________________
.event
teq r0,#10
teqne r0,#11
movnes pc,lr
stmfd sp !,{r0,r3-r7,lr}
teq r0,#10
beq mouseevent
ldrb r3,[r12,#keyspressed]
teq r1,#0
ldr r4,[r12,#keys]
subeq r3,r3,#1
addne r3,r3,#1
moveq r4,r4,lsr#8
orrne r4,r2,r4,lsl#8
Ktst r3,#1<<31 ;in case keys were pressed down while the
Lmovne r3,#0 ;module started up (which is likely if you
Cmovne r4,#0 ;double-clicked the application!)
strb r3,[r12,#keyspressed]
str r4,[r12,#keys]
teq r3,#0
ldmeqfdsp !,{r0,r3-r7,pc}^
mov r0,#&ff
and r5,r0,r4,lsr#8
and r6,r0,r4,lsr#16
mov r7,r4,lsr#24
and r4,r4,#&ff
4cmp r4,r5:movgt r0,r4:movgt r4,r5:movgt r5,r0
4cmp r4,r6:movgt r0,r4:movgt r4,r6:movgt r6,r0
4cmp r4,r7:movgt r0,r4:movgt r4,r7:movgt r7,r0
4cmp r5,r6:movgt r0,r5:movgt r5,r6:movgt r6,r0
4cmp r5,r7:movgt r0,r5:movgt r5,r7:movgt r7,r0
4cmp r6,r7:movgt r0,r6:movgt r6,r7:movgt r7,r0
orr r4,r4,r5,lsl#8
orr r4,r4,r6,lsl#16
orr r4,r4,r7,lsl#24
add r5,r12,#hotkeys
ldr r6,[r12,#hotkeysize]
.keyevent1
ldmia r5!,{r0,r7}
6teq r4,r0 ;compare with hotkey
beq keyevent2
.keyevent3
subs r6,r6,#8
bne keyevent1
ldmfd sp !,{r0,r3-r7,pc}^
.keyevent2
and r0,r7,#3
add r0,r0,#1
#Istrb r0,[r12,#interceptwimp];non-zero > key presses are intercepted
$3teq r0,r3 ;same nr of keys?
bne keyevent3
&:str r7,[r12,#pollword] ;will always be non-zero
ldmfd sp !,{r0,r3-r7,pc}^
;____________
.mouseevent
+.teq r3,#%010 ;MENU button
,4teqeq r1,#0 ;X coordinate = 0?
ldreq r0,[r12,#mouse]
streq r0,[r12,#pollword]
/Jstreqb r3,[r12,#interceptwimp];non-zero > mouse clicks are intercepted
ldmfd sp !,{r0,r3-r7,pc}^
2-.menufile dcb"<MyMenu$M>.Menu":dcb0:align
34.scanutil dcb"/<MyMenu$Dir>.ScanUtil":dcb0:align
4-;________________________________________
.servicecall
teq r1,#&49
teqne r1,#&4a
teqne r1,#&27
movnes pc,lr
stmfd sp !,{r7,lr}
ldr r12,[r12]
?4teq r1,#&49 ;Service_StartWimp
bne service2
ldr r7,[r12,#taskhandle]
teq r7,#0
mvneq r7,#0
streq r7,[r12,#taskhandle]
adreq r0,commandtable
moveq r1,#0
ldmfd sp !,{r7,pc}^
.service2
J6teq r1,#&4a ;Service_StartedWimp
bne service3
ldr r7,[r12,#taskhandle]
cmn r7,#1
moveq r7,#0
streq r7,[r12,#taskhandle]
ldmfd sp !,{r7,pc}^
.service3
S1;teq r1,#&27 ;Service_Reset
mov r7,#0
str r7,[r12,#taskhandle]
ldmfd sp !,{r7,pc}^
W-;________________________________________
.mycommand
stmfd sp !,{r14}
mov r2,r0
adr r1,titlestring
mov r0,#2
swi "XOS_Module"
ldmfd sp !,{pc}
.titlestring
dcb "MyMenu":dcb0
.helpstring
dEdcb "MyMenu":dcb9:dcb9:dcb"0.90 ("+d$+") by Richard Atterer":dcb0
.commandtable
f"dcb"Desktop_MyMenu":dcb0:align
dcd mycommand
dcd0:dcd0:dcd0:dcb0
i align
.task dcb"TASK"
.messagelist
dcd Message_SaveDesktop
dcd Message_MenusDeleted
dcd Message_HelpRequest
q .mask
r dcd%110000000001100101110001
t1.menuscan dcb"<MyMenu$M>.MenuScan":dcb0:align
u-;________________________________________
wP; If menu is loaded on demand, we have to deal with the following situations
x<; in order to claim/release application memory correctly
y6; (in brackets the changing values of 'menusopen')
{1;When no menu or another task's menu is open:
|1; - hotkey; opens one of our menus ( 0 -> 1 )
}-; - hotkey; executes *commands ( 0 -> 0 )
~#;When one of our menus is open:
I; - hotkey; would open the SAME menu which is already open ( 1 -> 1 )
6; - hotkey; opens a DIFFERENT menu ( 1 -> 2 -> 1 )
-; - hotkey; executes *commands ( 1 -> 1 )
L; - a menu entry which leads to a submenu is clicked; opens the submenu,
.; closes the parent menu ( 1 -> 2 -> 1 )
J; - a menu entry executing *commands is clicked with SELECT ( 1 -> 0 )
J; - a menu entry executing *commands is clicked with ADJUST ( 1 -> 1 )
N; - our menu is closed because the user clicks outside it, or another task
; opens one ( 1 -> 0 )
-;________________________________________
.err_nomem
dcd 1<<30
+dcb "Not enough free memory":dcb0:align
.nomemory
mov r0,#0
mvn r1,#0
swi "XWimp_SlotSize"
adr r0,err_nomem
.wimperror
mov r1,#1
adr r2,titlestring
swi "XWimp_ReportError"
b poll
-;________________________________________
.start
ldr r12,[r12]
ldr r0,[r12,#taskhandle]
cmp r0,#0
ldrgt r1,task
swigt "XWimp_CloseDown"
movgt r0,#0
strgt r0,[r12,#taskhandle]
mov r0,#300
ldr r1,task
adr r2,titlestring
adr r3,messagelist
swi "XWimp_Initialise"
bvs closedown
str r1,[r12,#taskhandle]
mov r0,#0
str r0,[r12,#pollword]
str r0,[r12,#oldpollword]
str r0,[r12,#keys]
strb r0,[r12,#keyspressed]
add sp,r12,#mystackend
;____________
.poll
d("Poll")
ldr r0,mask
ldr r1,[r12,#oldpollword]
teq r1,#0
bicne r0,r0,#1
bicne r0,r0,#1<<22
add r1,r12,#buf
add r3,r12,#pollword
swi "XWimp_Poll"
bvs closedown
teq r0,#0
beq null_reason
teq r0,#9
beq menu_selection
teq r0,#13
beq pollword_nonzero
teq r0,#17
teqne r0,#18
teqne r0,#19
bne poll
.user_message
ldr r0,[r1,#16]
"teq r0,#Message_SaveDesktop
beq mess_savedesk
,eor r2,r0,#Message_MenusDeleted
(teq r2,#Message_MenusDeleted
beq menusdeleted
+eor r2,r0,#Message_HelpRequest
'teq r2,#Message_HelpRequest
beq helprequest
teq r0,#0
bne poll
;____________
.closedown
mvn r0,#0
ldr r0,[r12,#taskhandle]
ldr r1,task
swi "XWimp_CloseDown"
adr r3,titlestring
swi "OS_ExitAndDie"
;____________
O;note - we needn't read MyMenu$Dir to a buffer on startup because it is not
J;possible that more than one copy of the program runs at the same time
;(cf 3-247)
.mess_savedesk
mov r5,r1
ldmia r1,{r2}
adr r0,variable
add r1,r1,r2
mov r6,r1
sub r2,sp,r1
mov r3,#0
swi "XOS_ReadVarVal"
bvs savedesk_error
mov r0,#
ldr r1,[r5,#20]
swi "XOS_BPut"
bvs savedesk_error
mov r0,#2
mov r3,r2
mov r2,r6
swi "XOS_GBPB"
bvs savedesk_error
mov r0,#10
swi "XOS_BPut"
bvs savedesk_error
b poll
;______
.savedesk_error
mov r11,r0
add r1,r12,#buf
ldr r0,[r1,#8]
str r0,[r1,#12]
mov r0,#19
ldr r2,[r1,#4]
swi "XWimp_SendMessage"
movvc r0,r11
b wimperror
(.variable dcb"MyMenu$Dir":dcb0:align
-;________________________________________
6;'menusopen' may become 2 for
E call to Wimp_Poll
I; 1. When one menu is open and a hotkey combination is pressed which
; opens a DIFFERENT menu
K; 2. When an item leading to a submenu is clicked (which will open the
.; submenu and close its 'parent' menu)
.menusdeleted
ldrb r0,[r12,#menusopen]
subs r0,r0,#1
strgeb r0,[r12,#menusopen]
d("menusdeleted^^menusopen is now ^0^")
streq r0,[r12,#lastopened]
bleq forgetmenu
b poll
-;________________________________________
.menu_selection
d("menu_selection")
mov r6,r1
add r1,r12,#buf+192
" swi "Wimp_GetPointerInfo"
ldr r0,[r1,#8]
$+strb r0,[r12,#reopenmenu] ;non-zero
ldr r2,[r12,#menublock]
ldr r5,[r12,#lastopened]
ldmia r6!,{r3}
*G.menusel1 ;for each item in returned Wimp block
add r3,r3,#1
,"ldr r1,[r5,r3,lsl#2]
ldmia r6!,{r3}
.4cmn r3,#1 ;further submenus?
beq execmenu_exec
0=bic r1,r1,#&f<<28 ;y > get address of submenu
add r1,r2,r1
.menusel2
ldr r4,[r5],#32
rsb r4,r4,r4,lsl#3
add r5,r5,r4,lsl#2
cmp r5,r1
blo menusel2
sub r5,r5,#32
sub r5,r5,r4,lsl#2
b menusel1
;-;________________________________________
.execitem12
mov r11,r0
mov r0,#0
swi "XOS_Find"
mov r0,r11
.execitem6
mov r1,#2
adr r2,titlestring
swi "XWimp_ReportError"
b execitem8
G-;________________________________________
.pollword_nonzero
d("pollword_nonzero")
ldr r0,[r12,#pollword]
L str r0,[r12,#oldpollword]
mov r0,#0
str r0,[r12,#pollword]
b poll
;____________
.null_reason
S!ldr r11,[r12,#oldpollword]
d("null_reason^^oldpollword=^11^")
cmn r11,#1
V"streqb r0,[r12,#interceptwimp]
W streq r0,[r12,#oldpollword]
beq poll
mvn r0,#0
[ str r0,[r12,#oldpollword]
bic r11,r11,#1<<31
mov r11,r11,lsr#2
mov r10,r11,lsr#16
bic r11,r11,r10,lsl#16
mov r0,#0
str r0,[r12,#pollword]
strb r0,[r12,#reopenmenu]
;____________
f-;r10=nr of menu, r11=nr of (submenu) item
.execmenu
d("execmenu^^nr of menu=^10^, nr of item=^11^")
ldrb r0,[r12,#ondemand]
teq r0,#0
ldreq r6,[r12,#menublock]
lMbeq execmenu3 ;> not on demand, ie menu already in memory
nNldrb r0,[r12,#menusopen] ;will contain 0 unless hotkey pressed when a
o8teq r0,#0 ;menu was already open
movne r6,#&8000
bne execmenu3
ldr r3,[r12,#totalsize]
ldr r4,[r12,#hotkeysize]
sub r0,r3,r4
mov r3,r0
mvn r1,#0
swi "XWimp_SlotSize"
bvs wimperror
cmp r0,r3
blt nomemory
mov r0,#&4f
adr r1,menuscan
swi "XOS_Find"
blvs forgetmenu
bvs wimperror
mov r1,r0
mov r0,#3
mov r2,#&8000
5add r4,r4,#24 ;for 24 byte header
swi "XOS_GBPB"
blvs forgetmenu
bvs wimperror
mov r0,#0
str r0,[r12,#relocadr]
swi "XOS_Find"
d("execmenu^^loaded on demand")
blvs forgetmenu
bvs wimperror
mov r6,#&8000
;______
1.execmenu3 ;r6=ptr to menu
d("execmenu3^^reloc")
ldr r0,[r12,#relocadr]
Csubs r1,r6,r0 ;relocadr <>0 after a soft reset!
beq execmenu4
Qldr r4,[r12,#nrofmenus] ;the direct pointers in menu tree need updating
str r6,[r12,#relocadr]
mov r0,r1
d("execmenu^^nr of menus=^4^, amount=^0^")
0.execmenu1 ;for each menu
ldr r2,[r0],#4+28
add r0,r0,r2,lsl#2
ldmia r0,{r3}
9tst r3,#1<<8 ;title data indirected?
ldrne r3,[r0,#-28]
addne r3,r3,r1
strne r3,[r0,#-28]
A.execmenu2 ;for each item (r2=nr of items)
ldmib r0,{r3,r5-r6}
cmn r3,#1
addne r3,r3,r1
tst r5,#1<<8
addne r6,r6,r1
stmib r0,{r3,r5-r6}
add r0,r0,#24
subs r2,r2,#1
bne execmenu2
subs r4,r4,#1
bne execmenu1
;______
.execmenu4
ldr r5,[r12,#menublock]
mov r2,r5
.execmenu5
subs r10,r10,#1
ldrpl r0,[r5],#4+28
rsbpl r0,r0,r0,lsl#3
addpl r5,r5,r0,lsl#2
bpl execmenu5
add r1,r5,#4
ldr r1,[r1,r11,lsl#2]
;______
B;r1=word of item to be executed, r2=ptr to start of menu data,
K;r5=addr of header before wimp menu data, somewhere before current menu
.execmenu_exec
d("exec^^word of item=^1^, start of menu data=^2^, menu header=^5^")
Qmovs r3,r1,lsr#30 ;menu / memory *comm offset /file *comm offset?
bic r1,r1,#&f<<28
bne execitem
'add r4,r2,r1 ;menu
.execmenu6
Qldr r0,[r5],#32 ;search for header before menu pointed to by R1
rsb r0,r0,r0,lsl#3
add r5,r5,r0,lsl#2
cmp r5,r4
blo execmenu6
sub r5,r5,r0,lsl#2
sub r5,r5,#32
ldr r6,[r12,#lastopened]
Dteq r5,r6 ;would this re-open the same menu?
beq poll
;ldrneb r0,[r12,#menusopen]
;addne r0,r0,#1
;strneb r0,[r12,#menusopen]
str r5,[r12,#lastopened]
add r1,r12,#buf
!swi "XWimp_GetPointerInfo"
bvs wimperror
ldmia r1,{r2-r3}
sub r2,r2,#64
mov r1,r4
swi "XWimp_CreateMenu"
bvs wimperror
ldrb r0,[r12,#menusopen]
add r0,r0,#1
strb r0,[r12,#menusopen]
b poll
;____________
.execitem
;teq r3,#%01 ;are *commands in memory?
$bne execitem3 ;n
d("execitem^^memory")
ldr r2,[r12,#menublock]
add r0,r2,r1
.execitem1
mov r2,r0
ldrb r1,[r0]
>cmp r1,#32 ;is this a 'packed' command?
blt execitem5
d("execitem/mem^^*$0^")
Fswi "XWimp_StartTask" ;COULD use OS_CLI, but this is safer
add r0,r2,#1
.execitem2
ldrb r1,[r0],#1
cmp r1,#32
bge execitem2
=teq r1,#0 ;was this the last command?
$bne execitem1 ;n
b execitem8
.execitem5
ldrb r3,[r0,#1]
orr r3,r3,r1,lsl#8
sub r0,r0,r3
d("execitem/mempacked^^*$0^")
swi "XWimp_StartTask"
add r0,r2,#3
ldrb r1,[r0,#-1]
teq r1,#0
bne execitem1
b execitem8
;____________
.execitem3
d("execitem^^file")
mov r2,r1
mov r0,#&4f
adr r1,menufile+1024
sub r1,r1,#1024
swi "XOS_Find"
bvs execitem6
mov r1,r0
mov r0,#1
0swi "XOS_Args" ;write seq ptr
mov r0,#6
ldr r3,[r12,#osclilen]
9swi "XOS_Module" ;claim temporary buffer
bvs execitem12
ldrb r4,[r12,#special]
mov r3,r2
.execitem4
swi "XOS_BGet"
bvs execitem11
.execitem7
strb r0,[r3],#1
cmp r0,#32
bge execitem4
mov r0,r2
swi "XWimp_StartTask"
swi "XOS_BGet"
bvs execitem11
(0teq r0,r4 ;last command?
movne r3,r2
bne execitem7
.execitem11
mov r0,#7
swi "XOS_Module"
mov r0,#0
swi "XOS_Find"
;______
.execitem8
ldrb r0,[r12,#reopenmenu]
d("execitem^^reopenmenu=^0^")
teq r0,#0
7/beq execitem9 ;hotkey press
84tst r0,#1 ;entry with ADJUST
moveq r0,#0
streq r0,[r12,#lastopened]
;Hstreqb r0,[r12,#menusopen] ;'decrease' (no Message_MenusDeleted!)
beq execitem10
ldr r1,[r12,#lastopened]
ldmia r1!,{r0}
add r1,r1,r0,lsl#2
@Nswi "XWimp_CreateMenu" ;DON'T increase menusopen - is already 1 coz
AQbvs wimperror ;NO Msg_MenusDeleted when menu sel. is returned
b poll
.execitem9
ENldrb r0,[r12,#menusopen] ;will be 1 if hotkey pressed while menu open
.execitem10
G@teq r0,#0 ;0 if item clicked with SELECT
bleq forgetmenu
b poll
J-;________________________________________
.forgetmenu
MC;test whether menu was loaded only on demand, de-allocate if so
stmfd sp !,{r0-r2,r4,lr}
ldrb r0,[r12,#ondemand]
teq r0,#0
ldmeqfdsp !,{r0-r2,r4,pc}^
mov r0,#0
strb r0,[r12,#menusopen]
mvn r1,#0
swi "XWimp_SlotSize"
;swi 256+7
d("menu forgotten")
ldmfd sp !,{r0-r2,r4,pc}^
Y-;________________________________________
.helprequest
adr r2,helpreplytext
add r3,r1,#20
.helpreq1
ldrb r0,[r2],#1
strb r0,[r3],#1
teq r0,#0
bne helpreq1
c7mov r0,#((helpreplytextend-helpreplytext)+23)
stmia r1,{r0}
e&mov r0,#Message_HelpReply
f(orr r0,r0,#Message_HelpReply
str r0,[r1,#16]
ldr r0,[r1,#8]
str r0,[r1,#12]
mov r0,#17
ldr r2,[r1,#4]
swi "XWimp_SendMessage"
bvc poll
b wimperror
.helpreplytext
dcb"Name:
MyMenu
s,dcb"Purpose: User-designed menu trees|M"
t)dcb"Author:
1996 Richard Atterer|M"
u1dcb"Version: V0.90 ("+date$+") Freeware":dcb0
.helpreplytextend
w-;________________________________________
debugging%
[optp
align
debug(p,washerefile$,20):]
:[optp
rmablock(p)
-;________________________________________
]O%+=128:[optp:]:O%-=128
2)=0 A$=
i%=code%
128:$i%=A$:
"Size: ";O%-code%"/&"~O%-code%" bytes (";
((O%-code%)/102.4+.5)/10" kBytes)."'"Time: ";
/100" seconds."
"Save "+save$+" "+
~code%+" "+
"SetType "+save$+" "+type$
REPEAT:A%=INKEY(0):MOUSEB%,B%,C%:UNTIL A%>-1ORC%>0
SYS"OS_Module",11,code%,O%-code%
rmablock(p)
P%:Otemp%=O%:[optp
-;________________________________________
;offsets in RMA block
.taskhandle dcd0
.pollword dcd0
.oldpollword dcd0
.relocadr dcd0
Q.keyspressed dcb0 ;nr of keys currently pressed, possibly also >4
?.menusopen dcb0 ;0, 1 or, for a short time, 2
Q.reopenmenu dcb0 ;>0 to check whether menu 2B reopened in execitem
N.interceptwimp dcb0:align ;>0 for the postfilter to intercept all keys
E.keys dcd0 ;key last pressed is in lowest byte
B.menublock dcd0 ;ptr to header before first menu
;.lastopened dcd0 ;addr of menu last opened
+.buf ]:O%+=256:P%+=256:[optp
+.mystack ]:O%+= 20:P%+= 20:[optp
.mystackend
;______
C;the following variables are loaded from start of file MenuScan
.totalsize dcd0
.hotkeysize dcd0
.osclilen dcd0
.nrofmenus dcd0
.ondemand dcb0;NB byte
&.special dcb0;NB byte:align
.mouse dcd0
.hotkeys
.rmablocksize%
-;________________________________________
O%=Otemp%:=0
d(a$)
debugging%
[optp
bl IWasHere
dcb a$:dcb0:align:]